/**
 * 题目描述：实现一个函数用来判断字符串是否表示数字
 */
public class E20 {
    public static void main(String[] args) {
        char[] str1 = {'+','1','0'};
        char[] str2 = {'2','.'};
        char[] str3 = {'3','.','1'};
        char[] str4 = {'3','.','2','e','5'};
        char[] str5 = {'1','.','3'};
        char[] str6 = {'.','3'};
        char[] str7 = {'-','1','E','-','1','6'};

        char[] str8 = {'+','-','5'};
        char[] str9 = {'1','.','2','.','3'};
        char[] str10 = {'1','a','3','.','1','4'};
        char[] str11 = {'1','2','e'};
        char[] str12 = {'1','.','4','e','+','6'};

        System.out.println(isNumeric(str1));
        System.out.println(isNumeric(str2));
        System.out.println(isNumeric(str3));
        System.out.println(isNumeric(str4));
        System.out.println(isNumeric(str5));
        System.out.println(isNumeric(str6));
        System.out.println(isNumeric(str7));
        System.out.println(isNumeric(str8));
        System.out.println(isNumeric(str9));
        System.out.println(isNumeric(str10));
        System.out.println(isNumeric(str11));
        System.out.println(isNumeric(str12));


    }


    static int index;
    public static boolean isNumeric(char[] str) {
        if(str == null){
            return false;
        }
        index = 0;
        boolean numeric = scanInteger(str);

        //检测出小数
        if( index < str.length && str[index] == '.'){
            index ++;
            /**
             * 1. 小数可以没有整数部分
             * 2. 小数点后面可以没有数字
             * 3. 小数点前后可以有数字
             */
            numeric = scanUnsignedInteger(str) || numeric;
        }

        //检测出指数, E之后是指数部分
        if(index < str.length && (str[index] == 'e' || str[index] == 'E')){
            index ++;
            /**
             * 使用 && 的原因：
             * 1. 当 e 或者 E 前面没有数字的时候，整个字符串不能表示数字
             * 2. 当 e 或者 E 后面没有数字的时候，整个字符串不能表示数字
             */
            numeric = numeric && scanInteger(str);
        }

        return  numeric && index == str.length;
    }


    //扫描 0~9
    public static boolean scanUnsignedInteger(char[] str){
        final int temp = index;

        while(index < str.length && str[index] >= '0' && str[index] <= '9'){
            index ++;
        }
        return index > temp;
    }


    //扫描可能以 + 或者 - 为起始的 0 ~ 9 的数位
    public static boolean scanInteger(char[] str){
        if(index < str.length &&(str[index] == '+' || str[index] == '-')){
            index ++;
        }
        return scanUnsignedInteger(str);
    }
}
/*
true
true
true
true
true
true
true
false
false
false
false
 */